widget: Remove toplevel flag
authorBenjamin Otte <otte@redhat.com>
Fri, 6 Apr 2018 18:30:34 +0000 (20:30 +0200)
committerBenjamin Otte <otte@redhat.com>
Fri, 15 Feb 2019 05:53:17 +0000 (06:53 +0100)
Instead, rely on GTK_IS_ROOT().

Also implement GtkRoot on GtkWindow and GtkInvisible, the two widgets
that used to set the toplevel flag before.

gtk/gtkinvisible.c
gtk/gtkprintoperation-win32.c
gtk/gtkwidget.c
gtk/gtkwidgetprivate.h
gtk/gtkwindow.c

index 37821039a6bd3a3566e4710c01f373c4f908b758..910b4063763f53145666a0ee2d1d7cc61fc28aab 100644 (file)
  */
 
 #include "config.h"
-#include <gdk/gdk.h>
+
 #include "gtkinvisibleprivate.h"
-#include "gtkwidgetprivate.h"
-#include "gtkprivate.h"
+
 #include "gtkintl.h"
+#include "gtkprivate.h"
+#include "gtkroot.h"
+#include "gtkwidgetprivate.h"
 
 
 /**
@@ -69,7 +71,15 @@ static void gtk_invisible_get_property  (GObject           *object,
                                         GParamSpec        *pspec);
 static void gtk_invisible_constructed   (GObject           *object);
 
-G_DEFINE_TYPE_WITH_PRIVATE (GtkInvisible, gtk_invisible, GTK_TYPE_WIDGET)
+static void
+gtk_invisible_root_interface_init (GtkRootInterface *iface)
+{
+}
+
+G_DEFINE_TYPE_WITH_CODE (GtkInvisible, gtk_invisible, GTK_TYPE_WIDGET,
+                         G_ADD_PRIVATE (GtkInvisible)
+                         G_IMPLEMENT_INTERFACE (GTK_TYPE_ROOT,
+                                               gtk_invisible_root_interface_init))
 
 static void
 gtk_invisible_class_init (GtkInvisibleClass *class)
@@ -107,7 +117,6 @@ gtk_invisible_init (GtkInvisible *invisible)
   priv = invisible->priv;
 
   gtk_widget_set_has_surface (GTK_WIDGET (invisible), TRUE);
-  _gtk_widget_set_is_toplevel (GTK_WIDGET (invisible), TRUE);
 
   g_object_ref_sink (invisible);
 
index ac18261c71fdb46c601006a6d0dcaff212e3fd51..4f21c1f17ff9e4c48d3b430c62ede81aa2b5b843 100644 (file)
@@ -1382,8 +1382,6 @@ pageDlgProc (HWND wnd, UINT message, WPARAM wparam, LPARAM lparam)
 
       SetWindowLongPtrW (wnd, GWLP_USERDATA, (LONG_PTR)op);
 
-      _gtk_widget_set_is_toplevel (plug, TRUE);
-
       gtk_window_set_modal (GTK_WINDOW (plug), TRUE);
       op_win32->embed_widget = plug;
       gtk_container_add (GTK_CONTAINER (plug), op->priv->custom_widget);
index 98505bbb5943573d9d584f57d25b8d28ac3dfc7d..4002e2ba12bad307da20535bf17137e424f76038 100644 (file)
@@ -6314,20 +6314,9 @@ gtk_widget_get_has_surface (GtkWidget *widget)
 gboolean
 gtk_widget_is_toplevel (GtkWidget *widget)
 {
-  GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
-
   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
 
-  return priv->toplevel;
-}
-
-void
-_gtk_widget_set_is_toplevel (GtkWidget *widget,
-                             gboolean   is_toplevel)
-{
-  GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
-
-  priv->toplevel = is_toplevel;
+  return GTK_IS_ROOT (widget);
 }
 
 /**
@@ -6898,7 +6887,7 @@ gtk_widget_verify_invariants (GtkWidget *widget)
         g_warning ("%s %p is mapped but not visible",
                    G_OBJECT_TYPE_NAME (widget), widget);
 
-      if (!priv->toplevel)
+      if (!GTK_IS_ROOT (widget))
         {
           if (!priv->child_visible)
             g_warning ("%s %p is mapped but not child_visible",
@@ -6946,7 +6935,7 @@ gtk_widget_verify_invariants (GtkWidget *widget)
                        G_OBJECT_TYPE_NAME (widget), widget);
 #endif
         }
-      else if (!priv->toplevel)
+      else if (!GTK_IS_ROOT (widget))
         {
           /* No parent or parent not realized on non-toplevel implies... */
 
@@ -6968,7 +6957,7 @@ gtk_widget_verify_invariants (GtkWidget *widget)
                        G_OBJECT_TYPE_NAME (parent), parent,
                        G_OBJECT_TYPE_NAME (widget), widget);
         }
-      else if (!widget->priv->toplevel)
+      else if (!GTK_IS_ROOT (widget))
         {
           /* No parent or parent not mapped on non-toplevel implies... */
 
index 6aa41f24307e48d7f1a03ec3119d80c5eaffb913..cdfe98b9beff06e1bf92d4d89599e8ded322b4ff 100644 (file)
@@ -32,6 +32,7 @@
 #include "gtkcsstypesprivate.h"
 #include "gtkeventcontroller.h"
 #include "gtklistlistmodelprivate.h"
+#include "gtkroot.h"
 #include "gtksizerequestcacheprivate.h"
 #include "gtkwindowprivate.h"
 #include "gtkinvisibleprivate.h"
@@ -55,7 +56,6 @@ struct _GtkWidgetPrivate
 #endif
 
   guint in_destruction        : 1;
-  guint toplevel              : 1;
   guint anchored              : 1;
   guint no_surface            : 1;
   guint no_surface_set        : 1;
@@ -226,8 +226,6 @@ void              _gtk_widget_set_has_default              (GtkWidget *widget,
                                                             gboolean   has_default);
 void              _gtk_widget_set_has_grab                 (GtkWidget *widget,
                                                             gboolean   has_grab);
-void              _gtk_widget_set_is_toplevel              (GtkWidget *widget,
-                                                            gboolean   is_toplevel);
 
 void              _gtk_widget_grab_notify                  (GtkWidget *widget,
                                                             gboolean   was_grabbed);
@@ -390,7 +388,7 @@ _gtk_widget_get_realized (GtkWidget *widget)
 static inline gboolean
 _gtk_widget_is_toplevel (GtkWidget *widget)
 {
-  return widget->priv->toplevel;
+  return GTK_IS_ROOT (widget);
 }
 
 static inline GtkStateFlags
index 03b8c500e9dccf58d2715b6d1cd6f521e861becd..4eccf40b2ded36c59200701b2fdc6d3feb8f1188 100644 (file)
@@ -61,6 +61,7 @@
 #include "gtkpointerfocusprivate.h"
 #include "gtkpopoverprivate.h"
 #include "gtkprivate.h"
+#include "gtkroot.h"
 #include "gtkseparatormenuitem.h"
 #include "gtksettings.h"
 #include "gtksnapshot.h"
@@ -561,6 +562,9 @@ static void gtk_window_buildable_custom_finished (GtkBuildable  *buildable,
                                                      const gchar   *tagname,
                                                      gpointer       user_data);
 
+/* GtkRoot */
+static void             gtk_window_root_interface_init                  (GtkRootInterface       *iface);
+
 static void ensure_state_flag_backdrop (GtkWidget *widget);
 static void unset_titlebar (GtkWindow *window);
 static void on_titlebar_title_notify (GtkHeaderBar *titlebar,
@@ -575,7 +579,9 @@ static void gtk_window_update_debugging (void);
 G_DEFINE_TYPE_WITH_CODE (GtkWindow, gtk_window, GTK_TYPE_BIN,
                          G_ADD_PRIVATE (GtkWindow)
                          G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
-                                               gtk_window_buildable_interface_init))
+                                               gtk_window_buildable_interface_init)
+                         G_IMPLEMENT_INTERFACE (GTK_TYPE_ROOT,
+                                               gtk_window_root_interface_init))
 
 static void
 add_tab_bindings (GtkBindingSet    *binding_set,
@@ -1860,7 +1866,6 @@ gtk_window_init (GtkWindow *window)
   widget = GTK_WIDGET (window);
 
   gtk_widget_set_has_surface (widget, TRUE);
-  _gtk_widget_set_is_toplevel (widget, TRUE);
   _gtk_widget_set_anchored (widget, TRUE);
 
   priv->title = NULL;
@@ -2493,6 +2498,11 @@ gtk_window_buildable_custom_finished (GtkBuildable  *buildable,
     }
 }
 
+static void
+gtk_window_root_interface_init (GtkRootInterface *iface)
+{
+}
+
 /**
  * gtk_window_new:
  * @type: type of window